﻿// Marked Ancestor Aizu - 2170.cpp : 此文件包含 "main" 函数。程序执行将在此处开始并结束。
//

#include <iostream>


using namespace std;
//https://vjudge.csgrandeur.cn/problem/Aizu-2170
/*
问题 F：
给你一棵由 N 个节点组成的树 T。考虑对 T 进行以下两种操作：

M v：（标记）标记节点 v。
Q v：（查询）打印离节点 v 最近的被标记祖先的索引。
最初，只有根节点被标记。请注意，节点是其自身的祖先。
你的任务是编写一个程序，对给定的树执行一系列这些操作，并计算每个 Q 操作将打印的值。
为避免输出文件过大，要求你的程序打印所有查询操作的输出总和。
请注意，评委们已经确认，在给定的序列中计算每个查询操作的输出是可能的。

输入
输入由多个数据集组成。每个数据集的格式如下：

输入的第一行包含两个整数 N 和 Q，分别表示树 T 中的节点数和操作数。
这些数字符合以下条件： 1 ≤ N ≤ 100000，1 ≤ Q ≤ 100000。

每一行包含一个整数 pi（i = 2, ... , N），表示第 i 个节点的父节点索引。

接下来的 Q 行按顺序包含操作。每个操作的格式都是 "M v "或 "Q v"，其中 v 是节点的索引。

最后一个数据集后面是一行包含两个 0 的行。这一行不属于任何数据集，不应被处理。

输出
对于每个数据集，在一行中打印所有查询操作的输出总和。

输入示例
6 3
1
1
2
3
3
Q 5
M 3
Q 5
0 0
样本输入的输出
4
*/

const int N = 100010;
int f[N];
const int INF = 0x3f3f3f3f;
int n, q;

void init() {
	for (int i = 0; i < N; i++) {
		f[i] = INF;
	}
}

int find(int x) {
	if (x != f[x]) {
		return find(f[x]);
	}

	return f[x];
}

int main()
{
	while (cin >> n >> q) {
		if (n == 0 && q == 0) break;
		init();
		for (int i = 2; i <= n; i++) {
			int t; cin >> t;
			f[i] = t;
		}
		f[1] = 1;
		string op; int t; 
		long long sum = 0;
		for (int i = 0; i < q; i++) {
			cin >> op >> t;
			if (op[0] == 'Q') {
				sum += find(t);
			}
			else {
				f[t] = t;
			}
		}

		cout << sum << endl;
	}


	return 0;
}

 